import warnings
warnings.filterwarnings('ignore')
from crewai import Agent, Crew, Task, LLM
import os
from dotenv import load_dotenv
import docx2txt  # 导入 python-docx2txt 库

# 配置 API 密钥
os.environ["DEEPSEEK_API_KEY"] = "sk-a2b633c6da8c445bbe7ec80b404552b8"  # 替换为实际的 DeepSeek API 密钥
load_dotenv()

# 初始化 LLM
llm = LLM(
    model="deepseek/deepseek-chat",
    timeout=500,
    api_base="https://api.deepseek.com/v1",
    headers={
        "Authorization": f"Bearer {os.environ['DEEPSEEK_API_KEY']}"
    }
)

# 读取 .doc 文件内容的函数
def read_doc(file_path):
    """读取 .doc 文件内容"""
    try:
        content = docx2txt.process(file_path)
        return content
    except Exception as e:
        print(f"读取文件 {file_path} 时出错: {e}")
        return ""

# 读取指定文件
file_path = r"C:\Users\15349\Desktop\问卷设计与stata\数据分析报告三线表-2025春(1).xlsx"
document_content = read_doc(file_path)

# 定义智能体
agent_1 = Agent(
    role="变量描述总结者",
    goal="阅读文件内容，根据文件中###. **三、变量描述 ###部分编写变量描述，介绍总结表格内容，写一段话，不超过 400 字，不得编造与使用外部数据和文件内容无关的内容",
    backstory="一位擅长数据分析和总结的专家，能够准确提炼变量描述信息",
    llm=llm,
    verbose=True
)

agent_2 = Agent(
    role="卡方检验总结者",
    goal="阅读文件内容，根据文件中###. **四、卡方检验###部分编写卡方检验，介绍总结表格内容，写一段话，不超过 400 字，不得编造与使用外部数据和文件内容无关的内容",
    backstory="一位精通统计分析的专家，擅长总结卡方检验结果",
    llm=llm,
    verbose=True
)

agent_3 = Agent(
    role="方差分析总结者 1",
    goal="阅读文件内容，根据文件中###. **六、方差分析 ###部分编写方差分析，介绍总结表格内容，写一段话，不超过 400 字，不得编造与使用外部数据和文件内容无关的内容",
    backstory="一位擅长方差分析的统计专家，能准确总结分析结果",
    llm=llm,
    verbose=True
)

agent_4 = Agent(
    role="方差分析总结者 2",
    goal="阅读文件内容，根据文件中###. **六、方差分析 ###部分编写方差分析，介绍总结表格内容，写一段话，不超过 400 字，不得编造与使用外部数据和文件内容无关的内容",
    backstory="一位擅长方差分析的统计专家，能准确总结分析结果",
    llm=llm,
    verbose=True
)

agent_5 = Agent(
    role="多元线性回归总结者",
    goal="阅读文件内容，根据文件中###. **1.多元线性回归###部分编写多元线性回归，介绍总结表格内容，写一段话，不超过 400 字，不得编造与使用外部数据和文件内容无关的内容",
    backstory="一位精通线性回归分析的专家，能准确总结多元线性回归结果",
    llm=llm,
    verbose=True
)

agent_6 = Agent(
    role="二元逻辑斯回归总结者",
    goal="阅读文件内容，根据文件中###. **2.二元逻辑斯回归###部分编写二元逻辑斯回归，介绍总结表格内容，写一段话，不超过 400 字，不得编造与使用外部数据和文件内容无关的内容",
    backstory="一位擅长逻辑斯回归分析的专家，能准确总结二元逻辑斯回归结果",
    llm=llm,
    verbose=True
)

agent_7 = Agent(
    role="内容整合者",
    goal="输出以上 6 位智能体的输出内容## Final Answer: ##部分，以 Markdown 的形式输出结果",
    backstory="一位擅长文档整理和格式化的专家，能够将零散信息整合为规范的 Markdown 文档",
    llm=llm,
    verbose=True
)

# 定义任务
task_1 = Task(
    description=f"请阅读以下文件内容：{document_content}，对其中###. **三、变量描述 ###部分的表格内容进行介绍和总结，写一段话，字数不超过 400 字，不得编造与使用外部数据和文件内容无关的内容",
    agent=agent_1,
    expected_output="变量描述总结文本"
)

task_2 = Task(
    description=f"请阅读以下文件内容：{document_content}，对其中###. **四、卡方检验###部分的表格内容进行介绍和总结，写一段话，字数不超过 400 字，不得编造与使用外部数据和文件内容无关的内容",
    agent=agent_2,
    expected_output="卡方检验总结文本"
)

task_3 = Task(
    description=f"请阅读以下文件内容：{document_content}，对其中###. **六、方差分析 ###部分的表格内容进行介绍和总结，写一段话，字数不超过 400 字，不得编造与使用外部数据和文件内容无关的内容",
    agent=agent_3,
    expected_output="方差分析总结文本 1"
)

task_4 = Task(
    description=f"请阅读以下文件内容：{document_content}，对其中###. **六、方差分析 ###部分的表格内容进行介绍和总结，写一段话，字数不超过 400 字，不得编造与使用外部数据和文件内容无关的内容",
    agent=agent_4,
    expected_output="方差分析总结文本 2"
)

task_5 = Task(
    description=f"请阅读以下文件内容：{document_content}，对其中###. **1.多元线性回归###部分的表格内容进行介绍和总结，写一段话，字数不超过 400 字，不得编造与使用外部数据和文件内容无关的内容",
    agent=agent_5,
    expected_output="多元线性回归总结文本"
)

task_6 = Task(
    description=f"请阅读以下文件内容：{document_content}，对其中###. **2.二元逻辑斯回归###部分的表格内容进行介绍和总结，写一段话，字数不超过 400 字，不得编造与使用外部数据和文件内容无关的内容",
    agent=agent_6,
    expected_output="二元逻辑斯回归总结文本"
)

task_7 = Task(
    description="请输出以上 6 个任务的输出内容## Final Answer: ##部分，以 Markdown 的形式输出结果",
    agent=agent_7,
    context=[task_1, task_2, task_3, task_4, task_5, task_6],
    expected_output="Markdown 格式的整合结果"
)

# 创建并运行工作流
workflow_crew = Crew(
    agents=[agent_1, agent_2, agent_3, agent_4, agent_5, agent_6, agent_7],
    tasks=[task_1, task_2, task_3, task_4, task_5, task_6, task_7],
    verbose=True
)

result = workflow_crew.kickoff()

# 假设 CrewOutput 对象有 content 属性，获取字符串内容
if hasattr(result, 'content'):
    result_content = result.content
else:
    # 如果没有 content 属性，尝试将对象转换为字符串
    result_content = str(result)

# 保存结果
with open("analysis_summary.md", "w", encoding="utf-8") as f:
    f.write(result_content)

print("分析总结已生成！请查看 analysis_summary.md 文件")
